#include "CCamera.h"
#include <windows.h>
#include "gltools.h"

Mat4 CCamera::GetCameraMatrix()
{
	Mat4 mONI = m_CamMat;
	mONI.OrthoNormalInvert();
	return mONI;
}

void CCamera::ApplyCameraMatrix()
{
	Mat4 mONI = m_CamMat;
	mONI.OrthoNormalInvert();
	glMultMatrixf(mONI.mm);
}
void CCamera::OrthoNormalize()
{
	m_CamMat.zaxis.Normalize();
	//m_CamMat.xaxis = Cross(m_CamMat.zaxis, Vec3(0, 1, 0));
	m_CamMat.xaxis = Cross(Vec3(0, 1, 0), m_CamMat.zaxis);
	m_CamMat.xaxis.Normalize();
	//m_CamMat.yaxis = Cross(m_CamMat.xaxis, m_CamMat.zaxis);
	m_CamMat.yaxis = Cross(m_CamMat.zaxis, m_CamMat.xaxis);
	m_CamMat.yaxis.Normalize();
}
void CCamera::LookAt(Vec3& vPoint)
{
	//This seems backwards because of OpenGL
	m_CamMat.zaxis = m_CamMat.waxis - vPoint;
	OrthoNormalize();
}
void CCamera::Attach(Vec3& vPoint, Vec3& vOffset)
{
	m_CamMat.waxis = vPoint + vOffset;
	LookAt(vPoint);
}

void CCamera::TranslateLocalX(float fDelta)
{
	m_CamMat.waxis += m_CamMat.xaxis * fDelta;
}
void CCamera::TranslateLocalY(float fDelta)
{
	m_CamMat.waxis += m_CamMat.yaxis * fDelta;
}
void CCamera::TranslateLocalZ(float fDelta)
{
	m_CamMat.waxis += m_CamMat.zaxis * fDelta;
}
void CCamera::TranslateLocal(float fX, float fY, float fZ)
{
	TranslateLocalX(fX);
	TranslateLocalY(fY);
	TranslateLocalZ(fZ);
}

void CCamera::RotateLocalX(float fDelta)
{
	m_CamMat = Mat4::GetRotateX(fDelta) * m_CamMat;
}
void CCamera::RotateLocalY(float fDelta)
{
	m_CamMat = Mat4::GetRotateY(fDelta) * m_CamMat;
}
void CCamera::RotateLocalZ(float fDelta)
{
	m_CamMat = Mat4::GetRotateZ(fDelta) * m_CamMat;
}
void CCamera::RotateLocal(float fDelta, Vec3& vAxis)
{
	m_CamMat = Mat4::GetRotateArbitrary(fDelta, vAxis) * m_CamMat;
}

void CCamera::TranslateGlobalX(float fDelta)
{
	m_CamMat.waxis.x += fDelta;
}
void CCamera::TranslateGlobalY(float fDelta)
{
	m_CamMat.waxis.y += fDelta;
}
void CCamera::TranslateGlobalZ(float fDelta)
{
	m_CamMat.waxis.z += fDelta;
}
void CCamera::TranslateGlobal(Vec3& vDelta)
{
	m_CamMat.waxis += vDelta;
}

void CCamera::RotateGlobalX(float fDelta)
{
	Vec3 vPos = m_CamMat.waxis;
	m_CamMat.waxis = Vec3(0, 0, 0);
	m_CamMat = m_CamMat * Mat4::GetRotateX(fDelta);
	m_CamMat.waxis = vPos;
}
void CCamera::RotateGlobalY(float fDelta)
{
	Vec3 vPos = m_CamMat.waxis;
	m_CamMat.waxis = Vec3(0, 0, 0);
	m_CamMat = m_CamMat * Mat4::GetRotateY(fDelta);
	m_CamMat.waxis = vPos;
}
void CCamera::RotateGlobalZ(float fDelta)
{
	Vec3 vPos = m_CamMat.waxis;
	m_CamMat.waxis = Vec3(0, 0, 0);
	m_CamMat = m_CamMat * Mat4::GetRotateZ(fDelta);
	m_CamMat.waxis = vPos;
}
void CCamera::RotateGlobal(float fDelta, Vec3& vAxis)
{
	Vec3 vPos = m_CamMat.waxis;
	m_CamMat.waxis = Vec3(0, 0, 0);
	m_CamMat = m_CamMat * Mat4::GetRotateArbitrary(fDelta, vAxis);
	m_CamMat.waxis = vPos;
}